/**
 * 网络请求封装
 * 自动添加 token，处理认证失败等场景
 */

/**
 * 封装的请求方法
 * @param {string} url - 请求地址
 * @param {object} options - 请求选项
 * @returns {Promise} - 返回 Promise
 */
function request(url, options = {}) {
  return new Promise((resolve, reject) => {
    const app = getApp();
    const token = uni.getStorageSync('session_token');
    const apiBase = app.globalData.apiBase;
    
    // 完整 URL
    const fullUrl = url.startsWith('http') ? url : `${apiBase}${url}`;
    
    uni.request({
      url: fullUrl,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        'Content-Type': 'application/json',
        'Authorization': token ? `Bearer ${token}` : '',
        ...options.header
      },
      success: (res) => {
        // 处理认证失败
        if (res.statusCode === 401) {
          uni.showToast({
            title: '请重新登录',
            icon: 'none'
          });
          
          // 触发重新登录
          app.login();
          reject(new Error('未授权'));
          return;
        }
        
        // 处理其他错误
        if (res.statusCode >= 400) {
          const errorMsg = res.data.message || '请求失败';
          uni.showToast({
            title: errorMsg,
            icon: 'none'
          });
          reject(new Error(errorMsg));
          return;
        }
        
        resolve(res.data);
      },
      fail: (err) => {
        uni.showToast({
          title: '网络错误',
          icon: 'none'
        });
        reject(err);
      }
    });
  });
}

/**
 * GET 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求参数
 * @param {object} options - 其他选项
 * @returns {Promise}
 */
function get(url, data, options = {}) {
  return request(url, { ...options, method: 'GET', data });
}

/**
 * POST 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 其他选项
 * @returns {Promise}
 */
function post(url, data, options = {}) {
  return request(url, { ...options, method: 'POST', data });
}

/**
 * PUT 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 其他选项
 * @returns {Promise}
 */
function put(url, data, options = {}) {
  return request(url, { ...options, method: 'PUT', data });
}

/**
 * DELETE 请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 其他选项
 * @returns {Promise}
 */
function del(url, data, options = {}) {
  return request(url, { ...options, method: 'DELETE', data });
}

module.exports = {
  request,
  get,
  post,
  put,
  del
};

